/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：呼叫中心-请求处理层-权限控制管理
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taiping.cc.authorize.webapi.controller;

import com.taiping.cc.authorize.pojo.dto.AuthLoginDTO;
import com.taiping.cc.authorize.webapi.handler.AccountHandler;
import com.taiping.dlt.pojo.bo.AuthLoginBO;
import com.taiping.dlt.pojo.query.AuthLoginQO;
import com.taipingframework.boot.web.response.result.ApiResult;
import com.taipingframework.utility.exception.ApplicationException;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.CompletableFuture;

/**
 * 账户管理
 *FIXME
 * 值得注意的是，统一认证中心不仅是指统一登录管理，它还包括统一系统账户管理 与 统一账户权限管理。
 * 所以，这里修改密码的接口、账户禁用等一系列接口，最终是需要移植到 企业统一认证中心的。
 * 另外，每个子系统的登录认证数据、系统账户数据、权限管理等相关数据，最终都是从统一认证中心同步过来的。
 *
 *FIXME
 * 需要避免混淆的一点是，门户站点的外网用户登录认证和信息管理，需要在某一个子系统中独立进行维护管理。
 */
@RestController
@RequestMapping("/account")
@RequiredArgsConstructor
public class AccountController {

    private final AccountHandler accountHandler;

    /**
     * 禁用账户/(逻辑)删除账户
     * FIXME -
     *  同步账户的线程不确认是否持有本地会话，但显然将该api-path加入白名单是不合适的。
     *  需要以open-api通过签名认证的方式对外开放，只走nginx网关，不走gateway网关。
     */
    @PostMapping(value = "/disable")
    public CompletableFuture<ApiResult<Boolean>> disableAccount(@RequestBody AuthLoginQO loginQO) {
        return accountHandler.disableAccount(loginQO
        ).exceptionally(throwable -> {
            throw new ApplicationException(throwable.getCause());
        }).toCompletableFuture();
    }

    /**
     * 推送登录认证数据（可以被登录通调用，也允许外部直接调用）
     * FIXME -
     *  推送数据的线程不确认是否持有本地会话，但显然将该api-path加入白名单是不合适的。
     *  需要以open-api通过签名认证的方式对外开放，只走nginx网关，不走gateway网关。
     */
    @PostMapping("/push")
    public CompletableFuture<ApiResult<Boolean>> push(@RequestBody AuthLoginDTO authLoginDTO) {
        return accountHandler.collect(authLoginDTO
        ).exceptionally(throwable -> {
            throw new ApplicationException(throwable.getCause());
        }).toCompletableFuture();
    }

    /**
     * 登录通-登录校验
     */
    @PostMapping("/valid")
    public CompletableFuture<ApiResult<AuthLoginBO>> valid(@RequestBody AuthLoginQO loginQO) {
        return accountHandler.valid(loginQO
        ).exceptionally(throwable -> {
            throw new ApplicationException(throwable.getCause());
        }).toCompletableFuture();
    }

}
